package com.waves.camear;
import com.github.sarxos.webcam.Webcam;
import com.github.sarxos.webcam.WebcamPanel;
import com.github.sarxos.webcam.WebcamResolution;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class WebcamMonitor extends JFrame {

    private Webcam webcam;  // Webcam 对象
    private WebcamPanel webcamPanel;  // 用于显示 Webcam 图像的 JPanel
    private JButton captureButton;  // 抓取图像的按钮
    private JLabel statusLabel; // 显示状态信息的标签

    public WebcamMonitor() {
        super("摄像头监控"); // 设置窗口标题

        // 1. 查找并初始化默认摄像头
        webcam = Webcam.getDefault();
        if (webcam == null) {
            JOptionPane.showMessageDialog(this, "未检测到摄像头!", "错误", JOptionPane.ERROR_MESSAGE);
            System.exit(1); // 退出程序
        }

        webcam.setViewSize(WebcamResolution.VGA.getSize()); // 设置分辨率 (例如, VGA)
        webcam.open(); // 打开摄像头

        // 2. 创建 WebcamPanel 以显示摄像头图像
        webcamPanel = new WebcamPanel(webcam);
        webcamPanel.setFPSDisplayed(true); // 显示 FPS (每秒帧数)
        webcamPanel.setDisplayDebugInfo(true); // 显示调试信息
        webcamPanel.setImageSizeDisplayed(true); // 显示图像尺寸
        webcamPanel.setMirrored(true); // 镜像图像

        // 3. 创建抓取按钮
        captureButton = new JButton("抓取图像");
        captureButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                captureImage(); // 调用抓取图像的方法
            }
        });

        // 4. 状态标签
        statusLabel = new JLabel("摄像头准备就绪");
        statusLabel.setHorizontalAlignment(SwingConstants.CENTER); // 居中显示

        // 5. 布局 UI
        JPanel controlPanel = new JPanel(new FlowLayout());
        controlPanel.add(captureButton); // 添加抓取按钮

        JPanel mainPanel = new JPanel(new BorderLayout());
        mainPanel.add(webcamPanel, BorderLayout.CENTER); // 添加摄像头面板到中心
        mainPanel.add(controlPanel, BorderLayout.SOUTH); // 添加控制面板到南部
        mainPanel.add(statusLabel, BorderLayout.NORTH); // 添加状态标签到北部

        getContentPane().add(mainPanel);

        // 6. 窗口设置
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口时退出程序
        pack(); // 自动调整大小
        setLocationRelativeTo(null); // 居中显示窗口
        setVisible(true); // 显示窗口
    }

    private void captureImage() {
        try {
            BufferedImage image = webcam.getImage(); // 获取摄像头图像
            if (image != null) {
                // 将图像保存到文件 (例如, 在项目目录中)
                File outputfile = new File("captured_image_" + System.currentTimeMillis() + ".png");
                ImageIO.write(image, "png", outputfile);
                statusLabel.setText("图像已抓取并保存到: " + outputfile.getAbsolutePath()); // 更新状态标签
            } else {
                statusLabel.setText("无法抓取图像.");
            }
        } catch (IOException e) {
            statusLabel.setText("保存图像时发生错误: " + e.getMessage());
            e.printStackTrace(); // 打印堆栈跟踪
        }
    }

    public static void main(String[] args) {
        // 确保 Swing 组件在事件分发线程上创建和更新.
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new WebcamMonitor(); // 创建并启动 WebcamMonitor
            }
        });
    }
}
